import { produce } from 'immer';
import { IDraggable } from './component_type'

const pd = (pageData: Array<any>, setPageData: any) => {
  // 添加操作，不同的组件实现逻辑不尽相同。推荐在组件内自己实现

  /**
   * 根据节点 ID 获取节点在 pageData 中的索引
   *
   * @param   {any}  id  对应 item.meta.id
   *
   * @return  {[type]}   null | number
   */
  const getIndexById = (id: any) => {
    let index: any = null;
    for (let i = 0; i < pageData.length; i++) {
      if (pageData[i].meta.id === id) {
        index = i
      }
    }
    return index;
  }

  /**
   * 根据节点 ID 获取节点
   *
   * @param   {any}  id  对应 item.meta.id
   *
   * @return  {[type]}   null | IDraggable
   */
  const getById = (id: any) => {
    let item: any = null;
    for (let i = 0; i < pageData.length; i++) {
      if (pageData[i].meta.id === id) {
        item = pageData[i]
      }
    }
    return item;
  }

  /**
   * 获取当前节点的孩子节点
   *
   * @param   {any}  parent  对应当前节点的 id
   *
   * @return  {[type]}       [return description]
   */
  const getChildrenByParent = (parent: any) => {
    let target = []
    for (var i = 0; i < pageData.length; i++) {
      if (pageData[i].meta.parent === parent) {
        // alert(video[i]["id"]);
        target.push(pageData[i]);
        getChildrenByParent(pageData[i].meta.id);
      }
    }
    return target;
  }

  /**
   * 根据节点 ID 删除节点
   *
   * @param   {any}  id  对应 item.meta.id
   *
   * @return  {[type]}   由于 pageData 是只读数据，因此这里返回新的 pageData. 
   *                     然后在外部，通过 set 函数重置 pageData
   */
  const deleteById = (id: any) => {
    const index = getIndexById(id)
    if (index != null) {
      const newPageData = produce(pageData, (draft: any) => {
        draft.splice(index, 1)
      })

      setPageData(newPageData)
    }
  }

  /**
   * 删除当前节点及其孩子节点
   *
   * @param   {any}  parent  对应当前选中节点的 id
   *
   * @return  {[type]}       由于 pageData 是只读数据，因此这里返回新的 pageData
   */
   const deleteByParent = (parent: any) => {
    // const children = getChildrenByParent(parent)
    // if (children.length > 0) {
    //   const newPageData = produce(pageData, (draft: any) => {
    //     draft.splice(index, 1)
    //   })
    //   return newPageData
    // } else {
    //   return pageData
    // }

    const children = getChildrenByParent(parent)
    var delSet = new Set(children); // 需要删除的内容
    var target: Array<any> = [];
    pageData.forEach(function(val, index) {
      if (!delSet.has(val) || val.meta.id !== parent) {
        target.push(val);
      }
    });

    setPageData(target)

    // return target;
  }

  /**
   * 删除当前节点的孩子节点
   *
   * @param   {any}  parent  对应当前选中节点的 id
   *
   * @return  {[type]}   由于 pageData 是只读数据，因此这里返回新的 pageData
   */
  const deleteChildrenByParent = (parent: any) => {
    const children = getChildrenByParent(parent)
    var delSet = new Set(children); // 需要删除的内容
    var target: Array<any> = [];
    pageData.forEach(function(val, index) {
      if (!delSet.has(val)) {
        target.push(val);
      }
    });

    console.log('ttttt', target)
    setPageData(target)

    // return target;
  }

  return {
    getIndexById,
    getById,
    deleteById,
    getChildrenByParent,
    deleteByParent,
    deleteChildrenByParent,
  }
}

export default pd